# 题目: 68. 文本左右对齐
给定一个单词数组和一个长度 maxWidth
,重新排版单词,使其成为每行恰好有 maxWidth
个字符,且左右两端对齐的文本。
你应该使用“贪心算法”来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格 ' ' 填充,使得每行恰好有 maxWidth 个字符。
要求尽可能均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。
文本的最后一行应为左对齐,且单词之间不插入额外的空格。
# 示例 1
输入:
words = ["This", "is", "an", "example", "of", "text", "justification."]
maxWidth = 16
输出:
[
"This is an",
"example of text",
"justification. "
]
# 示例 2
输入:
words = ["What","must","be","acknowledgment","shall","be"]
maxWidth = 16
输出:
[
"What must be",
"acknowledgment ",
"shall be "
]
解释: 注意最后一行的格式应为 "shall be " 而不是 "shall be",
因为最后一行应为左对齐,而不是左右两端对齐。
第二行同样为左对齐,这是因为这行只包含一个单词。
# 题解: 模拟
- 计算每一行可容纳的最大单词数,然后计算空格进行平均分配,多出来的平均到前面的单词间隔中
- 只有一个单词数时,左对齐
- 最后一行时,左对齐
# 代码
/**
* @param {string[]} words
* @param {number} maxWidth
* @return {string[]}
*/
var fullJustify = function(words, maxWidth) {
const ans = []
let right=0, n = words.length;
while(true){
// 单词的位置
let left = right;
let rowLength = 0;
// right - left 空格间隔数
while(right<n && rowLength + words[right].length + right -left <=maxWidth){
rowLength += words[right].length
right++
}
// 当前为最后一行 单词位置为 n
if(right === n) {
// 左对齐
let s = words.slice(left).join(' ')
ans.push(s + black(maxWidth - s.length))
return ans
}
const wordNum = right - left
const spaceNum = maxWidth - rowLength
// 当只有一个单词
if(wordNum === 1){
ans.push(words[left]+ black(spaceNum))
continue
}
// 填充空格
const avgSpace = Math.floor(spaceNum/(wordNum-1))
const extraSpace = spaceNum%(wordNum-1)
const s1 = words.slice(left,left+extraSpace+1).join(black(avgSpace+1))
const s2 = words.slice(left+extraSpace+1,right).join(black(avgSpace))
ans.push(s1+black(avgSpace)+s2)
}
};
const black = function(n){
return new Array(n).fill(' ').join('')
}